package com.stefanini.pe.bbva.bp.in.controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.iface.VencimientoBOIface;
import com.stefanini.pe.bbva.bp.in.model.ClienteDesbalanceadoModel;
import com.stefanini.pe.bbva.bp.in.model.LoginModel;
import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.ClienteDesbalanceado;
import com.stefanini.pe.bbva.bp.in.to.UsuarioSesion;
import com.stefanini.pe.bbva.bp.in.utils.ConstantesWeb;
import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Controller("clienteDesbalanceadoController")
@RequestScoped
public class ClienteDesbalanceadoController extends GenericoController{

	private static Logger logger = Logger.getLogger(ClienteDesbalanceadoController.class);
	
	@Autowired
	private VencimientoBOIface vencimientoBO;
	@Autowired
	private ClienteDesbalanceadoModel clienteDesbalanceadoModel;
	
	private LoginModel loginModel;
 
	public void onPageLoad(ComponentSystemEvent event) {
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionUserAndContextValide() && !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("ClienteDesbalanceadoController... is not Postback");
				
				LoginController loginContr = (LoginController)getHttpSession().getAttribute("loginController");
				loginModel = loginContr.getLoginModel();
				
				this.clienteDesbalanceadoModel.setCodigoAsesor(((UsuarioSesion) loginModel.getUsuarioSesion()).getIdUsuarioAsesor().toString());
				this.buscar();
				getSessionMap().put(ConstantesWeb.Reportes.PARAM_NOMBRE_REPORTE,ConstantesWeb.Reportes.REPORTE_CLIENTE_DESBALANCEADO);
			}
		} catch (Exception e) {
			mostrarError("Error:"+ String.valueOf(e.getMessage()));
			e.printStackTrace();
		}
	}
	
	public void buscar(){
		try{
			List<ClienteDesbalanceado> listClienteDesbalanceado = vencimientoBO.consultaClienteDesbalanceado(this.clienteDesbalanceadoModel.getCodigoAsesor());
			 
			String nomPerfil="";
			
			for (ClienteDesbalanceado oClienteDesbalanceado : listClienteDesbalanceado) {
				
				oClienteDesbalanceado.setFecPerfilado(Util.formatDateGuion(oClienteDesbalanceado.getFecPerfilado()));
				oClienteDesbalanceado.setFecRebalanceo(Util.formatDateGuion(oClienteDesbalanceado.getFecRebalanceo()));			
				
				nomPerfil =oClienteDesbalanceado.getNomPerfil();
				
				if(nomPerfil==null){
					nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
				}else{
					if(nomPerfil.trim().length()==0){
						nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
					}
				}
				oClienteDesbalanceado.setNomPerfil(nomPerfil);
			} 
			
			clienteDesbalanceadoModel.setListaConsultaGeneral(listClienteDesbalanceado);
			
			if (listClienteDesbalanceado.size()>0){
				llenarReporte();	
			}
		}catch(Exception e){
			mostrarError("Error: " + e.getMessage());
			logger.error(e.getMessage(),e);
		}	
	}
	
	private void llenarReporte(){
		List<ClienteDesbalanceado> listClienteDesbalanceado = vencimientoBO.consultaClienteDesbalanceadoReporte(this.clienteDesbalanceadoModel.getCodigoAsesor());
		 
		String nomPerfil="";
		
		for (ClienteDesbalanceado oClienteDesbalanceado : listClienteDesbalanceado) {
			oClienteDesbalanceado.setFecInformacion(Util.formatDate(oClienteDesbalanceado.getFecInformacion()));
			oClienteDesbalanceado.setFecPerfilado(Util.formatDateGuion(oClienteDesbalanceado.getFecPerfilado()));
			oClienteDesbalanceado.setFecRebalanceo(Util.formatDateGuion(oClienteDesbalanceado.getFecRebalanceo()));			
			oClienteDesbalanceado.setMontoActualDolarizado(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getMontoActualDolarizado())));
			oClienteDesbalanceado.setPesoActual(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoActual())));
			oClienteDesbalanceado.setPesoDesviacion(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoDesviacion())));
			oClienteDesbalanceado.setPesoDiferencia(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoDiferencia())));
			oClienteDesbalanceado.setPesoIdeal(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoIdeal())));
			
			nomPerfil =oClienteDesbalanceado.getNomPerfil();
			if(nomPerfil==null){
				nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
			}else{
				if(nomPerfil.trim().length()==0){
					nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
				}
			}
			oClienteDesbalanceado.setNomPerfil(nomPerfil);
		} 
		
		clienteDesbalanceadoModel.setListaConsultaReporte(listClienteDesbalanceado);
		getHttpSession().setAttribute("listaClienteDesbalanceado", listClienteDesbalanceado);
	}
	
	
	public void detalleCliente(Object ob){
		ClienteDesbalanceado clienteDesbalanceado = (ClienteDesbalanceado) ob;
		if (clienteDesbalanceado != null){
			llenarDatosPopup(clienteDesbalanceado.getCodcliente());
		}
	}
	
	private void llenarDatosPopup(String idCliente){
		List<ClienteDesbalanceado> listClienteDesbalanceado = vencimientoBO.consultaClienteDesbalanceadoModal(idCliente);
		this.clienteDesbalanceadoModel.setListaConsultaDetalle(new ArrayList<ClienteDesbalanceado>());
		
		String nomPerfil="";
		
		for (ClienteDesbalanceado oClienteDesbalanceado : listClienteDesbalanceado) {
			oClienteDesbalanceado.setFecInformacion(Util.formatDate(oClienteDesbalanceado.getFecInformacion()));
			oClienteDesbalanceado.setFecPerfilado(Util.formatDateGuion(oClienteDesbalanceado.getFecPerfilado()));
			oClienteDesbalanceado.setFecRebalanceo(Util.formatDateGuion(oClienteDesbalanceado.getFecRebalanceo()));			
			oClienteDesbalanceado.setMontoActualDolarizado(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getMontoActualDolarizado())));
			oClienteDesbalanceado.setPesoActual(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoActual())));
			oClienteDesbalanceado.setPesoDesviacion(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoDesviacion())));
			oClienteDesbalanceado.setPesoDiferencia(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoDiferencia())));
			oClienteDesbalanceado.setPesoIdeal(Util.formatDouble(Double.parseDouble(oClienteDesbalanceado.getPesoIdeal())));
			
			nomPerfil =oClienteDesbalanceado.getNomPerfil();
			if(nomPerfil==null){
				nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
			}else{
				if(nomPerfil.trim().length()==0){
					nomPerfil = Constantes.CONSTANTE_SIN_PERFIL;
				}
			}
			oClienteDesbalanceado.setNomPerfil(nomPerfil);
		} 
		
		clienteDesbalanceadoModel.setListaConsultaDetalle(listClienteDesbalanceado);
		
	}
	
	public ClienteDesbalanceadoModel getClienteDesbalanceadoModel() {
		return clienteDesbalanceadoModel;
	}
}
